package qualomelhor.gwt.modules.client;

import java.util.ArrayList;

import qualomelhor.database.BuscaComparacao;
import qualomelhor.database.Categoria;
import qualomelhor.database.LinkCategoria_Produto;
import qualomelhor.database.Produto;
import com.google.appengine.api.datastore.Blob;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;

public class EditarProduto implements EntryPoint {
	private Label lbId;
	private TextBox txtNomeProduto;
	private TextBox txtDescricao;
	private ListBox txtCategoria;
	private TextBox txtEnderecoFotoMini;
	private VerticalPanel vertPEnderecoFoto;
	private VerticalPanel vertPBusca;
	private VerticalPanel vertPLinkProduto;
    private VerticalPanel vertPBuscaComp;
	private TextBox[] txtEnderecoFoto;
	private CheckBox ckBloqueado;
	//private Label txtPath;
	private int posReg = 0;
	private ArrayList<Produto> listProdutos;
	private ArrayList<Categoria> listCategorias;
	private ISessionSuportServiceAsync serviceSupportSvc = GWT.create(ISessionSuportService.class);
	private Label lbNumRegistro;
	private TextBox[] txtNomeBusca;
	private TextBox[] txtLinkProduto;

	public static native void showDivBloqueio()  /*-{
		//$wnd.alert("teste = " + $doc.getElementById("divBloqueio").style.display);
		$doc.getElementById("divBloqueio").style.display="block";
		$doc.getElementById("divBloqueioSolido").style.display="block";
	}-*/;

	public static native void hideDivBloqueio()  /*-{
		//$wnd.alert("teste = " + $doc.getElementById("divBloqueio").style.display);
		$doc.getElementById("divBloqueio").style.display="none";
		$doc.getElementById("divBloqueioSolido").style.display="none";
	}-*/;

	@Override
	public void onModuleLoad() {
		System.out.println("iniciando editar produto...");
		carregaListProdutos();
	}

	public void carregaListProdutos() {
		carregaProdutos(true);
	}

	public void carregaListaCategorias() {
		carregaCategorias(true);
	}

	private void carregaFormAddBusca(final Long idProduto, String buscaExemplo) {

		showDivBloqueio();

		final RootPanel rootPanel = RootPanel.get("divPopupCentro");

		rootPanel.clear();
		VerticalPanel vertP = new VerticalPanel();
		vertP.setStylePrimaryName("divCemPorCento");
		vertP.addStyleName("divCenter");
    	rootPanel.add(vertP);

    	HorizontalPanel horP1 = new HorizontalPanel();
		vertP.add(horP1);
		vertP.setCellVerticalAlignment(horP1, HasVerticalAlignment.ALIGN_MIDDLE);

		final TextBox txtBusca = new TextBox();
		horP1.add(new Label("Nova Busca:"));
    	horP1.add(txtBusca);
    	txtBusca.setText(buscaExemplo);
    	txtBusca.setSelectionRange(0, buscaExemplo.length());

    	HorizontalPanel horP3 = new HorizontalPanel();
		vertP.add(horP3);
		vertP.setCellVerticalAlignment(horP3, HasVerticalAlignment.ALIGN_MIDDLE);

    	Button btnGravar = new Button("Gravar");
    	horP3.add(btnGravar);
    	btnGravar.setStylePrimaryName("btnGravar");

    	btnGravar.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				System.out.println("vai gravar busca .. idprod:[" + idProduto + "], busca:[" + txtBusca.getText() + "]");
				addBusca(idProduto, txtBusca.getText());
			}
		});

    	Button btnCancel = new Button ("Cancel");
    	horP3.add(btnCancel);
    	btnCancel.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				hideDivBloqueio();
				rootPanel.clear();
			}
		});
	}

	private void carregaFormEditarProduto() {
		System.out.println("listProdutos.size = " + listProdutos.size());
		System.out.println("listCategorias.size = " + listCategorias.size());
		RootPanel rootPanel = RootPanel.get("divCadastro");
		rootPanel.clear();
		//rootPanel.getElement().getStyle().setPosition(Position.RELATIVE);

		VerticalPanel verticalPanel = new VerticalPanel();
		rootPanel.add(verticalPanel, 22, 10);
		verticalPanel.setSize("278px", "280px");

		HorizontalPanel horizontalPanelNav = new HorizontalPanel();
		verticalPanel.add(horizontalPanelNav);

		Button btnNovaCategoria = new Button("Novo");
		btnNovaCategoria.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				novo();
			}
		});
		horizontalPanelNav.add(btnNovaCategoria);

		Button btnAnterior = new Button("Anterior");
		btnAnterior.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (posReg >= 0) {
					posReg--;
				}
				atualiza();
			}
		});
		horizontalPanelNav.add(btnAnterior);

		Button btnProximo = new Button("Proximo");
		btnProximo.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (posReg < listProdutos.size()) {
					posReg++;
				}
				atualiza();
			}
		});
		horizontalPanelNav.add(btnProximo);

		Button btnDeletar = new Button("Deletar");
		btnDeletar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				deletaProduto(listProdutos.get(posReg).getId());
			}
		});
		horizontalPanelNav.add(btnDeletar);

		lbNumRegistro = new Label("");
		horizontalPanelNav.add(lbNumRegistro);

		FlexTable tbCadastro = new FlexTable();
		verticalPanel.add(tbCadastro);

		Label lblNewLabel = new Label("Id:");
		tbCadastro.setWidget(0, 0, lblNewLabel);

		lbId = new Label("");
		tbCadastro.setWidget(0, 1, lbId);

		Label lblNewLabel_1 = new Label("Nome Produto:");
		tbCadastro.setWidget(1, 0, lblNewLabel_1); 
		lblNewLabel_1.setSize("138", "16");

		txtNomeProduto = new TextBox();
		tbCadastro.setWidget(1, 1, txtNomeProduto);

		Label lblNewLabel_2 = new Label("Id Categoria Pai:");
		tbCadastro.setWidget(2, 0, lblNewLabel_2);
		lblNewLabel_2.setSize("138", "16");

		txtCategoria = new ListBox();
		for (int i = 0; i < listCategorias.size(); i++) {
			txtCategoria.addItem(listCategorias.get(i).getNomeCategoria(), listCategorias.get(i).getId().toString());
		}
		tbCadastro.setWidget(2, 1, txtCategoria);
		txtCategoria.setWidth("152px");

		Label lblNewLabel_3 = new Label("Descrição:");
		tbCadastro.setWidget(3, 0, lblNewLabel_3);
		lblNewLabel_3.setSize("138", "16");

		txtDescricao = new TextBox();
		tbCadastro.setWidget(3, 1, txtDescricao);

		Label lblEnderecofoto = new Label("Endereço Foto:");
		tbCadastro.setWidget(4, 0, lblEnderecofoto);

		//txtEnderecoFoto = new TextBox();
		vertPEnderecoFoto = new VerticalPanel();
		tbCadastro.setWidget(4, 1, vertPEnderecoFoto);

		Label lblEnderecofotomini = new Label("Endereço Foto Mini:");
		tbCadastro.setWidget(5, 0, lblEnderecofotomini);

		txtEnderecoFotoMini = new TextBox();
		tbCadastro.setWidget(5, 1, txtEnderecoFotoMini);

		Label lblBloqueado = new Label("Bloqueado:");
		tbCadastro.setWidget(6, 0, lblBloqueado);
		lblBloqueado.setSize("138", "16");

		ckBloqueado = new CheckBox("");
		tbCadastro.setWidget(6, 1, ckBloqueado);

		//Label lblPath = new Label("Path:");
		//tbCadastro.setWidget(7, 0, lblPath);
		//lblPath.setSize("138", "16");

		//txtPath = new Label("");
		//tbCadastro.setWidget(7, 1, txtPath);

		vertPBusca = new VerticalPanel();
		verticalPanel.add(vertPBusca);

		HorizontalPanel horizontalPanel_8 = new HorizontalPanel();
		verticalPanel.add(horizontalPanel_8);
		verticalPanel.setCellHorizontalAlignment(horizontalPanel_8, HasHorizontalAlignment.ALIGN_CENTER);

		vertPLinkProduto = new VerticalPanel();
		verticalPanel.add(vertPLinkProduto);

		vertPBuscaComp = new VerticalPanel();
		verticalPanel.add(vertPBuscaComp);

		Button btnSalvar = new Button("Salvar");
		btnSalvar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				Long id = lbId.getText().equals("")?null:Long.valueOf(lbId.getText());
				Long idCategoriaPai = (txtCategoria.getSelectedIndex() == -1)?null:Long.valueOf(txtCategoria.getValue(txtCategoria.getSelectedIndex()));
				ArrayList<String> listEnderecoFoto = new ArrayList<String>(0);
				for (int i = 0; i < txtEnderecoFoto.length; i++) {
					if (!txtEnderecoFoto[i].getText().trim().equals("")) {
						listEnderecoFoto.add(txtEnderecoFoto[i].getText().trim());
					}
				}

				salvaProduto(id, txtNomeProduto.getText(), idCategoriaPai, txtDescricao.getText(), listEnderecoFoto, txtEnderecoFotoMini.getText(), ckBloqueado.getValue());
			}
		});
		horizontalPanel_8.add(btnSalvar);
		horizontalPanel_8.setCellHorizontalAlignment(btnSalvar, HasHorizontalAlignment.ALIGN_CENTER);
	}

	private void novo() {
		lbNumRegistro.setText("Novo Registro");
		lbId.setText("");
		txtNomeProduto.setText("");
		txtDescricao.setText("");
		txtEnderecoFoto = new TextBox[1];
		txtEnderecoFoto[0] = new TextBox();
		txtEnderecoFoto[0].setText("");
		txtEnderecoFotoMini.setText("");
		ckBloqueado.setValue(false);
		//txtPath.setText("");
		txtCategoria.setSelectedIndex(-1);
		vertPBusca.clear();
		vertPLinkProduto.clear();
	    vertPBuscaComp.clear();
	}

	private void atualiza() {
		if (posReg == -1 || posReg == listProdutos.size()) {
			novo();
		} else {
			lbNumRegistro.setText("Registro " + (posReg + 1) + " de " + listProdutos.size());
			lbId.setText(listProdutos.get(posReg).getId().toString());
			txtNomeProduto.setText(listProdutos.get(posReg).getNomeProduto());
			txtDescricao.setText(String.valueOf(listProdutos.get(posReg).getDescricao()));
			txtEnderecoFoto = new TextBox[listProdutos.get(posReg).getListEnderecoFoto().size()];
			vertPEnderecoFoto.clear();
			for (int z = 0; z < listProdutos.get(posReg).getListEnderecoFoto().size(); z++) {
				txtEnderecoFoto[z] = new TextBox();
				txtEnderecoFoto[z].setText(listProdutos.get(posReg).getListEnderecoFoto().get(z));
				vertPEnderecoFoto.add(txtEnderecoFoto[z]);
			}

			txtEnderecoFotoMini.setText(String.valueOf(listProdutos.get(posReg).getEnderecoFotoMini()));
			ckBloqueado.setValue(listProdutos.get(posReg).getBloqueado());
			//txtPath.setText(listProdutos.get(posReg).getPath());
			txtCategoria.setSelectedIndex(-1);
			if (listProdutos.get(posReg).getIdCategoria() != null) {
				for (int i = 0; i < txtCategoria.getItemCount(); i++) {
					if (txtCategoria.getValue(i).equals(listProdutos.get(posReg).getIdCategoria().toString())) {
						txtCategoria.setSelectedIndex(i);
						break;
					}
				}
			}

			vertPBusca.clear();
			txtNomeBusca = new TextBox[listProdutos.get(posReg).getListBusca().size()];
			for (int i = 0; i < listProdutos.get(posReg).getListBusca().size(); i++) {
				final HorizontalPanel horP = new HorizontalPanel();
				vertPBusca.add(horP);
				horP.add(new Label("Busca " + i));
				txtNomeBusca[i] = new TextBox();
				horP.add(txtNomeBusca[i]);
				txtNomeBusca[i].setText(listProdutos.get(posReg).getListBusca().get(i));
				if (!listProdutos.get(posReg).getListBusca().get(i).equals(listProdutos.get(posReg).getNomeProduto())) {
					Button btnDelBusca = new Button("Del");
					horP.add(btnDelBusca);
					btnDelBusca.setTitle("idProd:[" + listProdutos.get(posReg).getId() + "], Busca:[" + listProdutos.get(posReg).getListBusca().get(i) + "]!");
					btnDelBusca.addClickHandler(new ClickHandler() {
						@Override
						public void onClick(ClickEvent event) {
							Button b = (Button)event.getSource();
							Long idProd = Long.parseLong(b.getTitle().substring(8, b.getTitle().indexOf("], Busca:[")));
							String busca = b.getTitle().substring(b.getTitle().indexOf("Busca:[") + 7, b.getTitle().indexOf("]!"));
							deletaBusca(idProd, busca);
						}
					});
				}
			}

		    Button btnAddBusca = new Button("Nova Busca");
		    btnAddBusca.setStylePrimaryName("btnAdd");
		    vertPBusca.add(btnAddBusca);
		    btnAddBusca.addClickHandler(new ClickHandler() {
				@Override
				public void onClick(ClickEvent event) {
					carregaFormAddBusca(listProdutos.get(posReg).getId(), listProdutos.get(posReg).getNomeProduto());
				}
			});

		    vertPLinkProduto.clear();
		    carregaLinksProdutos(listProdutos.get(posReg).getId());

		    vertPBuscaComp.clear();
		    carregaListaBuscaComparacao(listProdutos.get(posReg).getId());
		}
	}

	private void salvaProduto(Long id, String nomeProduto, Long idCategoriaPai, String descricao, ArrayList<String> listEnderecoFoto, String enderecoFotoMini, boolean bloqueado) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});
		
		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Boolean b) {
				if (!b) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				}
				carregaProdutos(true);
			}
		};
		System.out.println("Salvando produto: id = " + id + ", nomeCategoria = " + nomeProduto + ", idCategoriaPai = " + idCategoriaPai + ", descricao = " + descricao + ", enderecoFoto.size = " + listEnderecoFoto.size() + ", enderecoFotoMini = " + enderecoFotoMini + ", bloqueado = " + bloqueado);
		serviceSupportSvc.gravaProduto(id, nomeProduto, idCategoriaPai, descricao, enderecoFotoMini, listEnderecoFoto, new ArrayList<Blob>(0), bloqueado, callback);
	}

	private void deletaProduto(Long id) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});
		
		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Boolean b) {
				if (!b) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				}
				carregaProdutos(true);
			}
		};
		System.out.println("Deletando produto..");
		serviceSupportSvc.deletaProduto(id, callback);
	}

	private void addBusca(Long idProduto, String busca) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Boolean b) {
				if (!b) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				} else {
					carregaListProdutos();
					hideDivBloqueio();
				}
			}
		};
		System.out.println("adicionando busca produto..");
		serviceSupportSvc.addBusca(idProduto, busca, callback);		
	}

	private void deletaBusca(Long idProd, String busca) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});
		
		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Boolean b) {
				if (!b) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				}
				carregaProdutos(true);
			}
		};
		System.out.println("Deletando busca idProd = " + idProd + ", busca = " + busca);
		serviceSupportSvc.deletaBusca(idProd, busca, callback);
	}

	void carregaProdutos (boolean recarregar) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {

			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<ArrayList<Produto>> callback = new AsyncCallback<ArrayList<Produto>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(ArrayList<Produto> result) {
				
				listProdutos = result;
				System.out.println("lista de produtos carregados...");
				carregaListaCategorias();
			}
		}; 

		System.out.println("carregando lista de produtos...");
		serviceSupportSvc.getListProdutos(recarregar, callback);
	}

	void carregaLinksProdutos (Long idProduto) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {

			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<ArrayList<LinkCategoria_Produto>> callback = new AsyncCallback<ArrayList<LinkCategoria_Produto>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(ArrayList<LinkCategoria_Produto> result) {
				for (LinkCategoria_Produto linkProd: result) {
					vertPLinkProduto.add(new Label("[" + linkProd.getLink() + "] - [" + linkProd.getLocale() + "]"));
				}
				System.out.println("lista de links carregados...");
			}
		}; 

		System.out.println("carregando lista de produtos...");
		serviceSupportSvc.carregaListLinkProduto(idProduto, callback);
	}

	void carregaCategorias (boolean recarregar) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<ArrayList<Categoria>> callback = new AsyncCallback<ArrayList<Categoria>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(ArrayList<Categoria> result) {
				listCategorias = result;
				System.out.println("lista de categorias carregada...");
				carregaFormEditarProduto();
			}
		};

		System.out.println("carregando lista de categorias...");
		serviceSupportSvc.getListCategorias(recarregar, callback);
	}

	void carregaListaBuscaComparacao (Long idProduto) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {

			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<ArrayList<BuscaComparacao>> callback = new AsyncCallback<ArrayList<BuscaComparacao>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(ArrayList<BuscaComparacao> result) {
				System.out.println("BuscaComparacoes retornadas: " + result.size());
				for (BuscaComparacao buscaComp: result) {
					vertPBuscaComp.add(new Label("prod:[" + buscaComp.getIdProduto() + "] - comparacao:[" + buscaComp.getIdComparacao() + "]"));
				}
				System.out.println("lista de buscas carregados...");
			}
		}; 

		System.out.println("carregando lista de Busca da comparacao...");
		serviceSupportSvc.carregaListaBuscaComparacao(idProduto, callback);
	}
}